/**
 * 
 */
package net.looker.monitor.crawler;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.concurrent.atomic.AtomicInteger;

import net.looker.work.CallBack;
import net.looker.work.Work;
import net.looker.work.WorkerPoolFactory;

/**
 * 抓取器抓取组
 * @author solosky
 *
 */
public class CrawlerGroup 
{
	
	/**
	 * 抓取器列表
	 * 保存每一个抓取器线程的引用
	 */
	private ArrayList <Crawler> crawlerList;
	
	/**
	 * 完成的抓取器计数器
	 */
	private AtomicInteger atomicInt;
	
	/**
	 * 构造函数，初始化抓取器列表
	 */
	public CrawlerGroup()
	{
		this.crawlerList = new ArrayList<Crawler>();
		this.atomicInt   = new AtomicInteger(0);
 	}
	/**
	 * 添加抓取器
	 * @param Crawler crawler 抓取器
	 */
	public void addCrawler(Crawler crawler)
	{
		crawler.setCallBack(new FinishedCallBack());
		crawlerList.add(crawler);
	}
	
	/**
	 * 判断抓取组的抓取器是否都已经完成
	 */
	public boolean isAllDone()
	{
		//如果完成的进程数与当前的进程数相等，则认为所有的线程已经完成
		return atomicInt.get()==crawlerList.size();
	}
	
	/**
	 * 等待所有的抓取任务完成
	 * @throws InterruptedException 
	 */
	public void waitAllDone() throws InterruptedException
	{
		synchronized(atomicInt)
		{
			//如果完成的抓抓取器数目小于完成数目，就继续等待
			while(!isAllDone())
				atomicInt.wait();
		}
	}
	
	/**
	 * 建立线程
	 * @throws InterruptedException 
	 */
	public void startAll() throws InterruptedException
	{
		Iterator<Crawler> it =crawlerList.iterator();
		//遍历所有线程，统计完成的进程数
		while (it.hasNext())
		{
			WorkerPoolFactory.get("looker").assignWork(it.next());
		}
	}
	
	/**
	 * 返回抓取器列表
	 */
	public ArrayList<Crawler> getCrawlerList() 
	{
		return crawlerList;
	}
	
	
	/**
	 * 内部类
	 * 实现了CallBack接口，用于抓取器完成后通知抓取组完成了
	 */
	public class FinishedCallBack implements CallBack
	{

		/* (non-Javadoc)
		 * @see net.looker.work.CallBack#call()
		 */
		@Override
		public void call() 
		{
			synchronized(atomicInt)
			{
				atomicInt.incrementAndGet();
				atomicInt.notifyAll();
			}
		}
		
	}
	
}
